Staging directory(Root File System)

Staging Directory
mkdir ~/rootfs; cd rootfs
mkdir bin dev etc home lib proc sbin sys tmp usr var
mkdir usr/bin usr/lib usr/sbin
mkdir -p var/log
cd ~/rootfs
sudo chown -R root:root *
init Program
Shell
    - bash
    - ash(bash보다 훨씬 작고 임베디드 시스템에 주로 사용)
    - hush(매우 작은 쉘로 메모리가 매우 작은 장치에서 유용)
Utility
BusyBox
Utility의 소스코드를 각각 크로스 컴파일하는 번잡한 일과 컴파일된 프로그램이 수십 메가에 이를 것을 해결하기 위해 사용됨
데스크톱 도구가 제공하는 기능의 부분집합만을 구현했지만, 대부분의 경우 충분하게 활용가능 (80:20 규칙)
busybox cat my_file.txt # coreutils/cat.c cat_main export!
혹은 사용하는 명령어에 대해 /bin/busybox로의 심볼릭 링크를 만들어 줌
(BusyBox 내부에 argv[0]에 대해서 함수를 호출하도록 작성)

단순화한 코드(실제 코드 아님)
applet_name=argv[0];
applet_name==bb_basename(applet_name);
run_applet_and_exit(applet_name, argv);
BusyBox는 init 프로그램, 다양한 수준의 복잡도를 가지는 Shell 몇 가지, 대부분의 관리 작업을 위한 Utility를 포함한
300개가 넘는 애플릿(applet)을 포함.
(간단한 버전의 vi도 포함되어 있음)
git clone git://busybox.net/busybox.git
cd busybox
git checkout 1_26_2
# Compile with Kconfig, Kbuild
make distclean
make defconfig
# set Target
make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf-
# make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi-
# BusyBox installed on Staging Directory
make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- install
Library
많은 프로그램들이 라이브러리와 링크(공유 라이브러리 사용)되어 있기 때문에 툴체인을 이용해 Staging Library에도 공유 라이브러리를
복사해주어야 한다.
필요한 라이브러리만 복사할려고 하는 경우, 의존 관계를 파악한 후 해당 라이브러리만 복사
readelf or ldd
cd ~/rootfs
arm-cortex_a8-linux-gnueabihf-readelf -a bin/busybox | grep "program interpreter"
arm-cortex_a8-linux-gnueabihf-readelf -a bin/busybox | grep "Shared library"
# tool-chain sysroot shared library
export SYSROOT=$(arm-cortex_a8-linux-gueabihf-gcc -print-sysroot)
# cp -a option: symbolic link
cp -a $SYSROOT/lib/ld-linux-armhf.so.3 lib
cp -a $SYSROOT/lib/libc.so.6 lib
cp -a $SYSROOT/lib/libm.so.6 lib
일반적인 라이브러리와 프로그램들은 디버깅과 추적을 위해 심볼 테이블에 약간의 정보를 포함하고 있다.
strip을 통해 임베디드 시스템을 위해 심볼 테이블을 스트립할 수 있다.
file rootfs/lib/libc.so.6 # not stripped
arm-cortex_a8-linux-gnueabihf-strip rootfs/lib/libc.so.6
# strip --strip-unneeded <module name>